package org.gorson.utils;

import org.apache.commons.lang3.CharUtils;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @discreption 字符串处理类
 * @date 2019-05-05 04:57:05
 * 1、判断字符串是否非空：isNotNull(String str)
 * 2、判断字符串是否为空：isNullOrBlank(String str)
 * 3、生成随机数：demicSeq(String head,String bu,int num)
 * 4、数据库字段转换成对象属性：fieldToProperty(String field)
 */
public class StringUtil {
	
	//构造方法私有化
	private StringUtil(){}
	
	/**
	 * @Title: isNotNull
	 * @Description: 判断字符串是否非空，或null，若都不是，则返回true
	 * @param str 需要判断的字符串
	 * @return true:该字符串不为null，且不空，且不为字符串null;否则返回false
	 * @date 2019-05-05 04:55:55
	 */
    public static boolean isNotNull(String str){
        boolean flag = false;
        if(str != null && !"".equals(str) && !"null".equals(str)){
            flag = true;
        }
        return flag;
    }

    /**
     * @Title: isNullOrBlank
     * @Description: 判断字符串是否为空，或null，若满足任意一个，则返回true
     * @param str 需要判断的字符串
     * @return true:该字符串为null，或空，或为字符串null;否则返回false
     * @date 2019-05-05 04:58:05
     */
    public static boolean isNullOrBlank(String str){
        boolean flag = false;
        if(str == null || "".equals(str) || "null".equals(str)){
            flag = true;
        }
        return flag;
    }

    /**
     * @Title: demicSeq
     * @Description: 生成随机数 (格式:head+bu+num位随机数)
     * @param head 输入参数
     * @param bu 输入参数(默认为日期：yyyyMMdd)
     * @param num 随机数位数
     * @return 返回随机数
     * @date 2019-05-05 04:59:27
     */
    public static String demicSeq(String head,String bu,int num){
        if(bu == null){
            Date date=new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            bu = sdf.format(date);
        }
        return head+bu+ Math.round(Math.random()*Math.pow(10, num));
    }

    /**
     * @Title: fieldToProperty
     * @Description: 数据库字段转换成对象属性 例如：user_name to UserName
     * @param field 数据库字段
     * @return 对象属性
     * @date 2019-05-05 05:03:30
     */
    public static String fieldToProperty(String field) {
        if (null == field) {
            return "";
        }
        char[] chars = field.toCharArray();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < chars.length; i++) {
            char c = chars[i];

            if (c == '_') {
                int j = i + 1;
                if (j < chars.length) {
                    sb.append((CharUtils.toString(chars[j])).toUpperCase());
                    i++;
                }
            } else {
                if(i == 0){
                    sb.append(CharUtils.toString(c).toUpperCase());
                }else{
                    sb.append(c);
                }

            }
        }
        return sb.toString();
    }


    /**
     * Unicode转中文
     * @param string unicode 字符串
     * @return 解码后的中文文字
     */
    public static String decodeUnicode(String string) {
        Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");
        Matcher matcher = pattern.matcher(string);
        char ch;
        while (matcher.find()) {
            ch = (char) Integer.parseInt(matcher.group(2), 16);
            string = string.replace(matcher.group(1), ch + "");
        }
        return string;
    }

    /**
     * 中文转Unicode
     */
    public static String encodeUnicode(String string) {
        char[] utfBytes = string.toCharArray();
        String unicodeBytes = "";
        for (int i = 0; i < utfBytes.length; i++) {
            String hexB = Integer.toHexString(utfBytes[i]);
            if (hexB.length() <= 2) {
                hexB = "00" + hexB;
            }
            unicodeBytes = unicodeBytes + "\\u" + hexB;
        }
        return unicodeBytes;
    }
    
    /**
   	 * 根据map中的参数，替换模板对应位置，生成序号。注意：模板的变量必须用{}括起来
   	 * @param templet 模板样式，注意：模板的变量必须用{}括起来
   	 * @param paramsMap 带有序号等参数
   	 * @return 序号
   	 * @author gaoyp 2019-05-28
   	 */
   	public static String getMsgContent(String templet, Map<String, String> paramsMap) {
   	      String newTemplet = templet;
   	      if ((newTemplet == null) || (newTemplet == "")) {
   	        return "";
   	      }
   	      Iterator iterator = paramsMap.entrySet().iterator();
   	      //因为入参paramMap的参数没有并且也不能使用{xxx}作为key，只能使用xxx为key，因此创建StringBuilder对象补全字符用于判断
   	      StringBuilder sb = new StringBuilder();
   	      while (iterator.hasNext()) {
   	        Map.Entry entry = (Map.Entry)iterator.next();
   	        String key = (String)entry.getKey();
   	        sb.delete(0, sb.length());//使用前清空StringBuilder对象
   	        sb.append("{").append(key).append("}");//拼接key用于判断模板中是否包含该key，拼接示例：{key}
   	        if (newTemplet.contains(sb.toString())) {
   	        	sb.delete(0, sb.length());//使用前清空StringBuilder对象
   		        sb.append("\\{").append(key).append("\\}");//拼接key用于替换模板中对应位置数据，拼接示例：\{key\}
   		        //注意：因为String的replaceAll方法使用正则表达式做替换，因此被替换的字符中直接包含{字符将会报错，因此需要转义为\{
   	        	newTemplet = newTemplet.replaceAll(sb.toString(), (String)entry.getValue());
   	        }
   	      }
   	      return newTemplet;
   	 }
   	
   	/**
	 * @Title   Object2String
	 * @Description 对象转化为string，目前在获取核算授权号时使用
	 * @param 	obj 支持String、BigDecimal、Long、Short、Integer
	 * @return  String
	 * @author  xiaxy
	 * @date    2020年3月11日下午20:17:30
	 */
	public static String Object2String(Object obj){
        String result = "";
        if(obj != null){
        	if(obj.getClass() == String.class){
                result = (String) obj;
            }
        	if(obj.getClass() == BigDecimal.class){
        		result = bigDecimal2String((BigDecimal) obj);
        	}
        	if(obj.getClass() == Long.class){
        		result = Long2String((Long) obj);;
        	}
        	if(obj.getClass() == Short.class){
        		result = Short2String((Short) obj);
        	}
        	if(obj.getClass() == Integer.class){
        		result = Integer2String((Integer) obj);
        	}
        }
        return result;
    }
	
	/**
     * Long类型转换为String
     * @param num
     * @return
     */
    private static String Long2String(Long num){
        String result = null;
        if(num != null){
            result = Long.toString(num);
        }
        return result;
    }
    
    /**
     * BigDecimal类型转换为String
     * @param num
     * @return
     */
    private static String bigDecimal2String(BigDecimal num){
        String result = null;
        if(num != null){
            result = num.toString();
        }
        return result;
    }
    
    /**
     * Inter类型转换为String
     * @param num
     * @return
     */
    private static String Integer2String(Integer num){
        String result = null;
        if(num != null){
            result = Integer.toString(num);
        }
        return result;
    }
    
    /**
     * Inter类型转换为String
     * @param num
     * @return
     */
    private static String Short2String(Short num){
        String result = null;
        if(num != null){
            result = Short.toString(num);
        }
        return result;
    }
    /**
	 * @Title   isAllNotNull
	 * @Description 判断字符串是否均非空
	 * @param 	args 字符串不定参数
	 * @return  boolean true:字符串均为null，且均不空，且均不为字符串null;否则返回false
	 * @author  gaoyp
	 * @date    20201107
	 */
	public static boolean isAllNotNull(String ...args ) {
		for(String arg : args) {
			if(!isNotNull(arg)) {
				return false;
			}
		}
		return true;
	}


    /**
     * 替换yyyyMMdd格式的字符串。注意：模板的变量必须用{}括起来
     * @param templet 模板样式，注意：模板的变量必须用{}括起来
     * @param dateStr 要替换的key为yyyyMMdd格式的字符串
     * @return 序号
     * @author gaoyp 2019-05-28
     */
    public static String replaceDateStr(String templet, String dateStr) {
        if ((templet == null) || (templet.equals(""))) {
            return "";
        }
        String key = "${yyyyMMdd}";
        return templet.replace(key,dateStr);
    }
}
